package com.qdhh.enrollment.util;

import com.qdhh.enrollment.dto.QuestionImportDTO;
import org.springframework.util.StringUtils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * Excel和CSV导入工具类
 */
public class ExcelImportUtil {
    
    /**
     * 解析CSV文件，返回题目导入项列表
     * CSV格式：分类ID,分类名称,题目类型,题目内容,选项A,选项B,选项C,选项D,正确答案
     */
    public static List<QuestionImportDTO.QuestionImportItem> parseCSV(InputStream inputStream) {
        List<QuestionImportDTO.QuestionImportItem> items = new ArrayList<>();
        
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
            
            String line;
            boolean isFirstLine = true;
            
            while ((line = reader.readLine()) != null) {
                // 跳过空行和标题行
                if (line.trim().isEmpty() || isFirstLine) {
                    isFirstLine = false;
                    continue;
                }
                
                // 解析CSV行（处理引号内的逗号）
                String[] fields = parseCSVLine(line);
                
                if (fields.length < 9) {
                    continue; // 跳过格式不正确的行
                }
                
                QuestionImportDTO.QuestionImportItem item = new QuestionImportDTO.QuestionImportItem();
                
                // 分类ID
                if (StringUtils.hasText(fields[0])) {
                    try {
                        item.setCategoryId(Integer.parseInt(fields[0].trim()));
                    } catch (NumberFormatException e) {
                        // 忽略无效的分类ID
                    }
                }
                
                // 分类名称
                item.setCategoryName(fields[1] != null ? fields[1].trim() : null);
                
                // 题目类型
                item.setType(fields[2] != null ? fields[2].trim() : "single");
                
                // 题目内容
                item.setQuestionText(fields[3] != null ? fields[3].trim() : null);
                
                // 选项A
                item.setOptionA(fields[4] != null && !fields[4].trim().isEmpty() ? fields[4].trim() : null);
                
                // 选项B
                item.setOptionB(fields[5] != null && !fields[5].trim().isEmpty() ? fields[5].trim() : null);
                
                // 选项C
                item.setOptionC(fields[6] != null && !fields[6].trim().isEmpty() ? fields[6].trim() : null);
                
                // 选项D
                item.setOptionD(fields[7] != null && !fields[7].trim().isEmpty() ? fields[7].trim() : null);
                
                // 正确答案
                item.setCorrectAnswer(fields[8] != null ? fields[8].trim() : null);
                
                // 只添加有效的题目项
                if (item.getQuestionText() != null && !item.getQuestionText().isEmpty() &&
                    item.getCorrectAnswer() != null && !item.getCorrectAnswer().isEmpty()) {
                    items.add(item);
                }
            }
            
        } catch (Exception e) {
            throw new RuntimeException("CSV解析失败: " + e.getMessage(), e);
        }
        
        return items;
    }
    
    /**
     * 解析CSV行，处理引号内的逗号
     */
    private static String[] parseCSVLine(String line) {
        List<String> fields = new ArrayList<>();
        StringBuilder currentField = new StringBuilder();
        boolean inQuotes = false;
        
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            
            if (c == '"') {
                // 切换引号状态
                inQuotes = !inQuotes;
            } else if (c == ',' && !inQuotes) {
                // 不在引号内，遇到逗号，结束当前字段
                fields.add(currentField.toString());
                currentField = new StringBuilder();
            } else {
                // 添加到当前字段
                currentField.append(c);
            }
        }
        
        // 添加最后一个字段
        fields.add(currentField.toString());
        
        return fields.toArray(new String[0]);
    }
}
